package org.zhangyp.n02datastructure.n01Array;

import java.util.ArrayList;
import java.util.List;

/**
 * 自己实现的ArrayList
 *
 * @author zhangyp
 * @date 2023/9/8 8:56
 */
public class MyAarryList<T> {

    private Object[] elementData;
    private int size;

    public MyAarryList() {
        this(1);
    }

    public MyAarryList(int initialCapacity) {
        this.size = 0;
        this.elementData = new Object[initialCapacity];
    }

    /**
     * 在末尾追加一个数据
     *
     * @param: data
     **/
    public void add(T data) {
        this.add(this.size, data);
    }

    /**
     * 中间插入一个数据
     *
     * @param: index
     * @param: data
     **/
    public void add(int index, T data) {
        // 添加时可以在数组最后追加一个数据，所以下标可以等于长度。不允许空数据插入。
        if (index > this.size) {
            throw new IndexOutOfBoundsException("可插入范围越界");
        }
        this.verifyLengthAndgrow();

        for (int i = this.size - 1; i >= index; i--) {
            // 把数据往后移动，直到需要添加的位置
            this.elementData[i + 1] = this.elementData[i];
        }
        this.size++;
        // 插入数据
        this.elementData[index] = data;
    }

    /**
     * 验证数组长度，如需要扩容就扩容
     *
     * @param:
     **/
    private void verifyLengthAndgrow() {
        if ((this.size + 1) > this.elementData.length) {
            // 扩容2倍
            Object[] newElementData = new Object[this.elementData.length * 2];
            // 遍历复制数据
            for (int i = 0; i < this.elementData.length; i++) {
                newElementData[i] = this.elementData[i];
            }
            this.elementData = newElementData;
            System.out.println("进行了一次扩容...数组长度变成了：" + this.elementData.length);
        }
    }

    /**
     * 删除某个位置的数据
     *
     * @param: index
     **/
    public void delete(int index) {
        if (index > (this.size - 1)) {
            throw new IndexOutOfBoundsException("下标越界");
        }
        for (int i = index; i < (this.size - 1); i++) {
            // 把数据往前移动，直到末尾前一个
            this.elementData[i] = this.elementData[i + 1];
        }
        // 末尾数据置空
        this.size--;
        this.elementData[this.size] = null;
    }

    /**
     * 获取数据
     *
     * @param: index
     **/
    public T get(int index) {
        if (index > (this.size - 1)) {
            throw new IndexOutOfBoundsException("下标越界");
        }
        return (T) elementData[index];
    }

    public void print() {
        System.out.print("[");
        for (int i = 0; i < this.size; i++) {
            System.out.print(this.elementData[i] + (i == this.size - 1 ? "" : ","));
        }
        System.out.println("]");
    }

    public static void main(String[] args) {
        MyAarryList<String> list = new MyAarryList();
        list.add("aa");
        list.add("bb");
        list.add("cc");
        list.add("dd");
        list.add("ee");
        list.print();
        System.out.println("第3个数据为：" + list.get(2));
        list.delete(2);
        list.print();
        List<String> a = new ArrayList<>();
    }
}
